package com.DHH.wx.action;

import java.io.ByteArrayInputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.PrintWriter;
import java.io.UnsupportedEncodingException;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;


import com.DHH.Config.ApiConstant;
import com.DHH.wx.util.MessageUtil;
import com.DHH.wx.util.PayUtil;
import com.DHH.wx.util.PaymentPo;
import com.DHH.wx.util.UUIDHexGenerator;
import com.alibaba.fastjson.JSONObject;
import org.dom4j.Document;
import org.dom4j.DocumentException;
import org.dom4j.Element;
import org.dom4j.io.SAXReader;




/**
 * 支付请求，调用统一下单
 * timeStamp 时间戳
 * nonceStr 随机字符串，长度为32个字符以下。
 * package 统一下单接口返回的 prepay_id 参数值，提交格式如：prepay_id=*
 * paySign //签名
 * @author Administrator
 *
 */

public class Pay_Launch  {

	public JSONObject doPost1(String out_trade_no,String openid,String body,String total_fee) throws UnsupportedEncodingException {

		String appid= ApiConstant.APIID;//小程序ID
		String mch_id=ApiConstant.WX_M_id;//商户号
		String nonce_str= UUIDHexGenerator.generate();//随机字符串
        String spbill_create_ip="192.168.2.222";//终端ip
        String notify_url=ApiConstant.WX_PAY_NOTICE;//通知地址
        String trade_type="JSAPI";//交易类型
        String key = "&key=DaHuiHuiBikeSecret12345678912345"; // 商户支付密钥

		//商品描述 示例：腾讯充值中心-QQ会员充值

		//System.out.println(body);

		String today = new SimpleDateFormat("yyyyMMddHHmmss").format(new Date());
        String code = PayUtil.createCode(8);
       // String out_trade_no = mch_id+today+code;//商户订单号=商户号+当前时间+uuid
        //System.out.println("商户订单号:"+out_trade_no);


        //String total_fee1= String.valueOf(total_fee);
        //System.out.println("total_fee1:"+total_fee);



        Map<String, String> sParaTemp = new HashMap<String, String>();

        sParaTemp.put("appid", appid);
        sParaTemp.put("body", body);
        sParaTemp.put("mch_id", mch_id);
        sParaTemp.put("nonce_str", nonce_str);
        sParaTemp.put("notify_url",notify_url);
        sParaTemp.put("openid", openid);
        sParaTemp.put("out_trade_no", out_trade_no);
        sParaTemp.put("spbill_create_ip", spbill_create_ip);
        sParaTemp.put("total_fee", total_fee);
        sParaTemp.put("trade_type", trade_type);



        // 除去数组中的空值和签名参数
	    Map<String, String> sPara = PayUtil.paraFilter(sParaTemp);
        String prestr = PayUtil.createLinkString(sPara); // 把数组所有元素，按照“参数=参数值”的模式用“&”字符拼接成字符串


        //MD5运算生成签名
        String sign = PayUtil.sign(prestr, key, "utf-8").toUpperCase();
       // System.out.println("签名为："+sign);

        PaymentPo paymentPo = new PaymentPo();
        paymentPo.setAppid(appid);
        paymentPo.setMch_id(mch_id);
        paymentPo.setNonce_str(nonce_str);
        //String newbody=new String(body.getBytes("ISO-8859-1"),"UTF-8");//以utf-8编码放入paymentPo，微信支付要求字符编码统一采用UTF-8字符编码
        paymentPo.setBody(body);
        paymentPo.setOut_trade_no(out_trade_no);
        paymentPo.setTotal_fee(total_fee);
        paymentPo.setSpbill_create_ip(spbill_create_ip);
        paymentPo.setNotify_url(notify_url);
        paymentPo.setTrade_type(trade_type);
        paymentPo.setOpenid(openid);
        paymentPo.setSign(sign);

        //打包要发送的xml
        String respXml = MessageUtil.messageToXML(paymentPo);
        // 打印respXml发现，得到的xml中有“__”不对，应该替换成“_”
        respXml = respXml.replace("__", "_");
        String url = "https://api.mch.weixin.qq.com/pay/unifiedorder";//统一下单API接口链接
        String param = respXml;
        //System.out.println(respXml);
        //System.out.println("请求参数为:"+param);//请求参数

        String result =PayUtil.httpRequest(url, "POST", param);

        // 将解析结果存储在HashMap中
        Map<String, String> map = new HashMap<String, String>();
        InputStream in=new ByteArrayInputStream(result.getBytes("utf-8"));
        // 读取输入流
        SAXReader reader = new SAXReader();
        Document document;
		try {
			document = reader.read(in);
			// 得到xml根元素
	        Element root = document.getRootElement();
	        // 得到根元素的所有子节点
	        @SuppressWarnings("unchecked")
	        List<Element> elementList = root.elements();
	        for (Element element : elementList) {
	            map.put(element.getName(), element.getText());
	        }
		} catch (DocumentException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}


       // 返回信息
        String return_code = map.get("return_code");//返回状态码
        String return_msg = map.get("return_msg");//返回信息
       // System.out.println("返回信息："+return_msg+",返回状态码:"+return_code);

        JSONObject JsonObject=new JSONObject();
        if(return_code=="SUCCESS"||return_code.equals(return_code)){
            // 业务结果

            String prepay_id = map.get("prepay_id");//返回的预付单信息
            //System.out.println(prepay_id);

            String nonceStr=UUIDHexGenerator.generate();
            JsonObject.put("nonceStr", nonceStr);//nonceStr:随机字符串，长度为32个字符以下。

            JsonObject.put("package", "prepay_id="+prepay_id);//统一下单接口返回的 prepay_id 参数值，提交格式如：prepay_id=*

            Long timeStamp= System.currentTimeMillis()/1000;
            JsonObject.put("timeStamp", timeStamp+"");//timeStamp:时间戳从1970年1月1日00:00:00至今的秒数,即当前的时间

            String stringSignTemp = "appId="+appid+"&nonceStr=" + nonceStr + "&package=prepay_id=" + prepay_id+ "&signType=MD5&timeStamp=" + timeStamp;
            //再次签名
            String paySign=PayUtil.sign(stringSignTemp, key, "utf-8").toUpperCase();
            JsonObject.put("paySign", paySign);//签名
            System.out.println(paySign);


           return (JsonObject);

        }
        return (JsonObject);
	}
}
